package com.bachelor.unity_remote_control;

import java.net.InetAddress;
import java.net.UnknownHostException;

import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Vibrator;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;

import com.bachelor.networking.ImageStorage;
import com.bachelor.networking.MyService;
import com.bachelor.networking.MyService.StopReceiver;
import com.bachelor.networking.SendMessageMenu;
import com.example.resultrecdemo.R;
import com.example.resultrecdemo.util.SystemUiHider;

/**
 * An example full-screen activity that shows and hides the system UI (i.e.
 * status bar and navigation/system bar) with user interaction.
 * 
 * @see SystemUiHider
 */
public class MenuViewActivity extends Activity {
	/**
	 * Whether or not the system UI should be auto-hidden after
	 * {@link #AUTO_HIDE_DELAY_MILLIS} milliseconds.
	 */
	private static final boolean AUTO_HIDE = true;

	/**
	 * If {@link #AUTO_HIDE} is set, the number of milliseconds to wait after
	 * user interaction before hiding the system UI.
	 */
	private static final int AUTO_HIDE_DELAY_MILLIS = 3000;

	/**
	 * If set, will toggle the system UI visibility upon interaction. Otherwise,
	 * will show the system UI visibility upon interaction.
	 */
	private static final boolean TOGGLE_ON_CLICK = true;

	/**
	 * The flags to pass to {@link SystemUiHider#getInstance}.
	 */
	private static final int HIDER_FLAGS = SystemUiHider.FLAG_HIDE_NAVIGATION;

	/**
	 * The instance of the {@link SystemUiHider} for this activity.
	 */
	private SystemUiHider mSystemUiHider;
	int mainActivityActiveFragment;
	private InetAddress serverIP;
	public final int TEXT_VIEW_ACTIVITY=1, IMAGE_VIEW_ACTIVITY=5;
	MenuResultReceiver resultReceiver;
	Intent intent;
	ImageStorage semafor;
	Vibrator vibrator;
	
	public void startService() {
		if (intent == null) {
			Log.d("Intent", "Started");
			resultReceiver = new MenuResultReceiver(null, this);
			intent = new Intent(getApplicationContext(), MyService.class);
			intent.putExtra("receiver", resultReceiver);
			startService(intent);
		}

	}
	

	
	@Override
	protected void onDestroy() {
		super.onDestroy();
		Log.d("onDestroyMenu", "executed");
		serverIP = null;
	}
	
	@Override
	protected void onResume() {
		super.onResume();
		startService();
	}
	
	@Override
	protected void onPause(){
		
		Intent sIntent = new Intent();
		sIntent.setAction(StopReceiver.ACTION_STOP);
		sendBroadcast(sIntent);
		intent=null;
		Log.d("menu", "onPause");
		super.onPause();
		Intent returnIntent = new Intent();
		returnIntent.putExtra("active_fragment",mainActivityActiveFragment);
		setResult(RESULT_CANCELED,returnIntent);     
		//finish();
		
		
	}
	
	
	/**
	 * Funkcia ktora zachytava result zo SettingActivity
	 */
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// super.onActivityResult(requestCode, resultCode, data);

		if (requestCode == TEXT_VIEW_ACTIVITY){
			if (resultCode == RESULT_OK){
				Log.d("TEXT ACTIVITY", "BACK TO MENU");
			}
		}
		if (requestCode == IMAGE_VIEW_ACTIVITY){
			Log.d("IMAGE ACTIVITY", "BACK TO MENU");
		}
		
	}
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.activity_menu_view);
		vibrator=(Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

		
		
		final View controlsView = findViewById(R.id.fullscreen_content_controls);
		final View contentView = findViewById(R.id.fullscreen_content);
		
		// Set up an instance of SystemUiHider to control the system UI for
		// this activity.
		mSystemUiHider = SystemUiHider.getInstance(this, contentView,
				HIDER_FLAGS);
		mSystemUiHider.setup();
		mSystemUiHider
				.setOnVisibilityChangeListener(new SystemUiHider.OnVisibilityChangeListener() {
					// Cached values.
					int mControlsHeight;
					int mShortAnimTime;

					@Override
					@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
					public void onVisibilityChange(boolean visible) {
						if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
							// If the ViewPropertyAnimator API is available
							// (Honeycomb MR2 and later), use it to animate the
							// in-layout UI controls at the bottom of the
							// screen.
							if (mControlsHeight == 0) {
								mControlsHeight = controlsView.getHeight();
							}
							if (mShortAnimTime == 0) {
								mShortAnimTime = getResources().getInteger(
										android.R.integer.config_shortAnimTime);
							}
							controlsView
									.animate()
									.translationY(visible ? 0 : mControlsHeight)
									.setDuration(mShortAnimTime);
						} else {
							// If the ViewPropertyAnimator APIs aren't
							// available, simply show or hide the in-layout UI
							// controls.
							controlsView.setVisibility(visible ? View.VISIBLE
									: View.GONE);
						}

						if (visible && AUTO_HIDE) {
							// Schedule a hide().
							delayedHide(AUTO_HIDE_DELAY_MILLIS);
						}
					}
				});

		// Set up the user interaction to manually show or hide the system UI.
		contentView.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {
				if (TOGGLE_ON_CLICK) {
					mSystemUiHider.toggle();
				} else {
					mSystemUiHider.show();
				}
			}
		});

		// Upon interacting with UI controls, delay any scheduled hide()
		// operations to prevent the jarring behavior of controls going away
		// while interacting with the UI.
		Button back=(Button)findViewById(R.id.escape_menu_button);
		back.setOnTouchListener(mDelayHideTouchListener);
		back.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent returnIntent = new Intent();
				returnIntent.putExtra("active_fragment",mainActivityActiveFragment);
				setResult(RESULT_CANCELED,returnIntent);     
				finish();
			}
		});
		
		Bundle b = getIntent().getExtras();
		String textFromServer = b.getString("text");
		String ip=b.getString("serverIP");
		try {
			
			serverIP=InetAddress.getByName(ip.replace("/", ""));
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		mainActivityActiveFragment=b.getInt("active_fragment");
		String separator=getResources().getString(R.string.TEXT_MENU_SEPARATOR);
		textFromServer=textFromServer.substring(textFromServer.indexOf(separator)+1);
		final String[] items=textFromServer.split(separator);
		ArrayAdapter<String> itemsAdapter = 
			    new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items);
		ListView menuListView=(ListView)findViewById(R.id.menu_listView);
		menuListView.setAdapter(itemsAdapter);
		menuListView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
					long arg3) {
				// TODO Auto-generated method stub
				Log.d("onItemClick", items[arg2] );
				//sendMessage(getResources().getString(R.string.CLIENT_SEND_MENU_ITEM) + " " + items[arg2]);
				/*Intent returnIntent = new Intent();
				returnIntent.putExtra("active_fragment",mainActivityActiveFragment);
				returnIntent.putExtra(getResources().getString(R.string.CLIENT_SEND_MENU_ITEM),items[arg2]);
				setResult(RESULT_OK,returnIntent);     
				finish();*/
				vibrator.vibrate(50);
				sendMessage(items[arg2]);
				
			}
			
		});
		
		
	}
	
	private void sendMessage(String msg){
		new SendMessageMenu(serverIP, getResources().getInteger(R.integer.PORT)).execute(msg);
	}

	@Override
	protected void onPostCreate(Bundle savedInstanceState) {
		super.onPostCreate(savedInstanceState);

		// Trigger the initial hide() shortly after the activity has been
		// created, to briefly hint to the user that UI controls
		// are available.
		delayedHide(100);
	}

	/**
	 * Touch listener to use for in-layout UI controls to delay hiding the
	 * system UI. This is to prevent the jarring behavior of controls going away
	 * while interacting with activity UI.
	 */
	View.OnTouchListener mDelayHideTouchListener = new View.OnTouchListener() {
		@Override
		public boolean onTouch(View view, MotionEvent motionEvent) {
			if (AUTO_HIDE) {
				delayedHide(AUTO_HIDE_DELAY_MILLIS);
			}
			return false;
		}
	};

	Handler mHideHandler = new Handler();
	Runnable mHideRunnable = new Runnable() {
		@Override
		public void run() {
			mSystemUiHider.hide();
		}
	};

	/**
	 * Schedules a call to hide() in [delay] milliseconds, canceling any
	 * previously scheduled calls.
	 */
	private void delayedHide(int delayMillis) {
		mHideHandler.removeCallbacks(mHideRunnable);
		mHideHandler.postDelayed(mHideRunnable, delayMillis);
	}
}
